﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Financeiro.Dados;
using System.Data;
using System.Globalization;

namespace Financeiro.Model
{
    public class ContasModel
    {
        private double valor;
        private string descricao;
        private DateTime data_criacao;
        private DateTime data_vencimento;
        private int status;

        public double Valor
        {
            get { return valor; }
            set { valor = value; }
        }

        public string Descricao
        {
            get { return descricao; }
            set { descricao = value; }
        }

        public DateTime DataCriacao
        {
            get { return data_criacao; }
            set { data_criacao = value; }
        }

        public DateTime DataVencimento
        {
            get { return data_vencimento; }
            set { data_vencimento = value; }
        }

        public int Status
        {
            get { return status; }
            set { status = value; }
        }

        public ContasModel(double valor, string descricao, DateTime data_criacao, DateTime data_vencimento, int status)
        {
            this.valor = valor;
            this.descricao = descricao;
            this.data_criacao = data_criacao;
            this.data_vencimento = data_vencimento;
            this.status = status;
        }

        public int createConta(int id_atendimento)
        {
            return ContasDAO.insertConta(this.valor, this.descricao, this.data_criacao, this.data_vencimento, id_atendimento, this.status);
        }

        // Método que lista todas as contas a receber (tipo 0) ou a pagar (tipo 1) em um DataTable
        static public DataTable listContas(int tipo)
        {
            return ContasDAO.listContas(tipo);
        }

        static public DataTable listContas(int tipo, DateTime inicio, DateTime final)
        {
            return ContasDAO.listContas(tipo, inicio, final);
        }

        static public ContasModel getConta(int id)
        {
            DataTable conta_tabela = ContasDAO.retrieveConta(id);
            try
            {
                DataRow row = conta_tabela.Rows[0];
                ContasModel conta_obj = new ContasModel(Convert.ToInt32(row["valor"]), 
                                                        row["descricao"].ToString(),
                                                        Convert.ToDateTime(row["data_criacao"]),
                                                        Convert.ToDateTime(row["data_vencimento"]), 
                                                        Convert.ToInt32(row["status"]));

                return conta_obj;
            }
            catch
            {
                return null;
            }
        }

        public static void atualizaDataEmissao(int id, DateTime data_emissao)
        {
            ContasDAO.updateDataEmissao(id, data_emissao);
        }

        public static DataTable listarServicos(int id)
        {
            return ContasDAO.listServicos(id);
        }

        public static void atualizaDataPagamento(int id, DateTime data_pagamento)
        {
            ContasDAO.updateDataPagamento(id, data_pagamento);
        }

		public static void atualizaConta(int id, double valor, string descricao, DateTime data_vencimento, int id_atendimento)
		{
			ContasDAO.updateConta(id, valor, descricao, data_vencimento, id_atendimento);
		}
        static public int getAtendimento(int id)
        {
            return ContasDAO.retrieveAtendimento(id);
        }

        public static string getDataEmissao(int id)
        {
            return ContasDAO.retrieveDataEmissao(id);
        }
        
        static public Double getSaldo()
        {
            Double saldo = 0;
            DataTable charges_grid = ContasModel.listContas(0);
            DataTable debts_grid = ContasModel.listContas(1);

            foreach (DataRow row in charges_grid.Rows)
            {
                int status = Convert.ToInt32(row["status"]);
                // A conta a receber só será contabilizada se já tiver sido paga (status = 2)
                if (status == 1)
                {
                    saldo = saldo + Convert.ToDouble(row["valor"]);
                }
            }

            foreach (DataRow row in debts_grid.Rows)
            {
                int status = Convert.ToInt32(row["status"]);
                // A conta a receber só será contabilizada se já tiver sido paga (status = 2)
                if (status == 1)
                {
                    saldo = saldo - Convert.ToDouble(row["valor"]);
                }
            }
            return saldo;
        }

        static public Boolean solicitaCota(Double valor)
        {
            Double saldo_disponivel = 0;

            saldo_disponivel = getSaldo();
            if (valor > saldo_disponivel)
            {
                return false;
            }
            else
            {
                DateTime data_criacao = DateTime.Now;
                DateTime data_vencimento = data_criacao.AddDays(30);

                ContasModel nova_conta = new ContasModel(valor, "Debito de cota", data_criacao, data_vencimento, 1);
                nova_conta.createConta(0);
                return true;
            }
        }
    }
}
